package com.jiangnan.warehouse_management.common;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Result<T> implements Serializable {
    private static final long serialVersionUID = 1L;
    
    private Integer code;
    private String message;
    private T data;
    private Object errorDetails; // 错误详情字段
    
    // 成功响应（带数据）
    public static <T> Result<T> success(T data) {
        return Result.<T>builder()
            .code(200)
            .message("操作成功")
            .data(data)
            .build();
    }

    // 成功响应（不带数据）
    public static <T> Result<T> success() {
        return success(null);
    }
    

    // 失败响应（自定义错误码、消息和详情）
    public static <T> Result<T> fail(Integer code, String message, Object errorDetails) {
        return Result.<T>builder()
            .code(code)
            .message(message)
            .errorDetails(errorDetails)
            .build();
    }

    // 失败响应（自定义错误码和消息）
    public static <T> Result<T> fail(Integer code, String message) {
        return fail(code, message, null);
    }

    // 失败响应（仅错误消息，默认错误码500）
    public static <T> Result<T> fail(String message) {
        return fail(500, message, null);
    }
    
    // 常用错误码的快捷方法
    public static <T> Result<T> badRequest(String message) {
        return fail(400, message);
    }
    
    public static <T> Result<T> unauthorized(String message) {
        return fail(401, message);
    }
    
    public static <T> Result<T> forbidden(String message) {
        return fail(403, message);
    }
    
    public static <T> Result<T> notFound(String message) {
        return fail(404, message);
    }
    
    public static <T> Result<T> internalError(String message) {
        return fail(500, message);
    }
}